package com.ftg.learn.chapter02;

import com.ftg.learn.chapter02.entity.User;
import com.ftg.learn.chapter02.service.UserService;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * annotation-base
 *  1 : 把大量的配置，从xml里面称出，我们全部通过注解来完成.
 *  1.1 首先我们要把类加载的问题，从手写变成spring 自动完成
 *  1.2 配置文件来完成，指定包的扫描，然后spring自动根据包地址 ，以及包里的类声明来完成 容器注入功能
 *  2 如何完成
 *  2.1 我们要用到spring上下文
 *  2.2 就是要在spring.xml里面声明 扫描机制  <context:component-scan base-package="com.ftg.learn.chapter02"></context:component-scan>
 *  2.3 作用，就是扫描指定的包，完成对包里类的监测，如果发现当前类有注解，按注解完成加载，以及依赖关系
 *  2.4 有哪些常见注解:
 *        Component : 组件，表示把当前注入到容器当中,成为一个组件
 *  模型层注解
 *  2.4.1 Repository : 表示当前类做为数据模型层注入到容器里面
 *  2.4.2 Service    : 表示当前类做为业务模型层注入到容器里面
 *  控制器注解 spring framework - spring mvc
 *  2.4.3 Controller :  同步开发 . 每一个方法处理完成一般会有两种方案 ，直接到显示页面  jsp
 *  2.4.4 RestController : 数据处理控制器
 *       Rest    : 表述性状态传递, 不关心谁用这个数据。 数据一个独立部分 通用api 调我的api可以给你数据.
 *       Restful : 软件开发风格  (标准) ，getmapping - get postmaping - 添加 put 查一  修改   delete 删除
 *       RestController  :
 *        一定满足 rest,实现了restful风格,方法返回信息要求转换成为一json字符串
 *        实现方式  ：
 *            底层 ：@Controller    : 当前类是一个前端控制器
 *                 :@ResponseBody  ： 当前类里面的方法返回信息要求转换成为一json字符串
 *  依赖查找类
 *  2.4.3 Autowired  : 从容器里面查找同一类型的组件,默认按类型查找
 *  2.4.4 Qualifier("uuuu")  : 从容器里面查找同一类型的组件,按名称查找
 *  2.4.5 Resource 不是spring的注解 ，是JSR-250  从容器里面查找同一类型的组件 ，黄色波浪线问题
 *  赋值
 *  2.4.6 Value 指属性初始值的注解
 *  作用域 : ConfigurableBeanFactory.SCOPE_PROTOTYPE
 *  2.4.7 Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE 原型)
 *                 ConfigurableBeanFactory.SCOPE_SINGLETON :单例
 *  2.4.8 Configuration   表示配置，即使用java类的方式来完成配置文件的功能
 *        白话 ： 它就是一个配置文件.就是完成类的注入，
 *  2.4.9 Bean  : 往往要与2.4.8联用，修改方法 ，表示把方法的返回值，做为组件放到容器里面
 *  2.4.10  @PostConstruct JSR-250标准，表示当前方法在spring实例组件时，自动执行,为创建实例的时候，提供前置处理、参数等
 *  2.4.11  @PreDestroy 销毁时
 * @author kangjx
 * @date 2022/11/2
 */
public class LearnAnnotationPro {


    public static void main(String[] args) {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("springcontext.xml");
//        UserService userService = (UserService) applicationContext.getBean("userService");
//        userService.test1();



        User user1 = (User) applicationContext.getBean("user2");
        System.out.println(user1.getName());
    }


}

